package com.fau.wmbj.server.interceptor;

import cn.dev33.satoken.stp.StpUtil;
import com.fau.wmbj.server.entity.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 *
 * @author jiawei
 * @version 1.0
 * @datetime 2024-02-26 16:20
 */
public class CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        response.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self'; frame-ancestors 'self'");
        response.setHeader("Access-Control-Allow-Origin", (request).getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Referer-Policy", "no-referrer");
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        // 获取当前token（这个token获取的是请求头的token，也可以用 request 获取）
        String tokenValue = StpUtil.getTokenValue();
        // 根据token获取用户id（这里如果找不到id直接返回null，不会报错）
        String loginId = (String) StpUtil.getLoginIdByToken(tokenValue);
        //判断token的创建时间是否大于2小时，如果是的话则需要生成新的token
        long time = System.currentTimeMillis() - StpUtil.getSession().getCreateTime();
        long hour = time / 1000 / (60 * 60);
        if (hour > 2) {
            //获取session中存储的用户信息，重新登录后，将这个用户信息重新设置到session中。
            User user = (User) StpUtil.getSession().get("user");
            StpUtil.logout(loginId); // 这里要生成新的token的话，要先退出再重新登录
            StpUtil.login(loginId); // 然后再重新登录，生成新的token
            String newToken = StpUtil.getTokenValue();
            if(StpUtil.getSession() != null){
                StpUtil.getSession().set("user", user);
            }
        }
        long tokenTimeout = StpUtil.getTokenTimeout();// 获取过期时间
        //token没过期，过期时间不是-1的时候，每次请求都刷新过期时间
        if (tokenTimeout != -1) {
            StpUtil.renewTimeout(7200);// 用于token续期
            StpUtil.updateLastActiveToNow();
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
